package com.baidu.disconf.client.store.aspect; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.baidu.disconf.client.common.annotations.DisconfFile; import com.baidu.disconf.client.common.annotations.DisconfFileItem; import com.baidu.disconf.client.common.annotations.DisconfItem; import com.baidu.disconf.client.config.DisClientConfig; import com.baidu.disconf.client.store.DisconfStoreProcessor; import com.baidu.disconf.client.store.DisconfStoreProcessorFactory; import com.baidu.disconf.client.support.utils.MethodUtils; import com.baidu.disconf.core.common.constants.DisConfigTypeEnum; /** * 配置拦截 * * @author liaoqiqi * @version 2014-6-11 */ @Aspect public class DisconfAspectJ { protected static final Logger LOGGER = LoggerFactory.getLogger(DisconfAspectJ.class); @Pointcut(value = "execution(public * *(..))") public void anyPublicMethod() { } /** * 获取配置文件数据, 只有开启disconf远程才会进行切面 * * @throws Throwable */ @Around("anyPublicMethod() && @annotation(disconfFileItem)") public Object decideAccess(ProceedingJoinPoint pjp, DisconfFileItem disconfFileItem) throws Throwable { if (DisClientConfig.getInstance().ENABLE_DISCONF) { MethodSignature ms = (MethodSignature) pjp.getSignature(); Method method = ms.getMethod(); // // 文件名 // Class<?> cls = method.getDeclaringClass(); DisconfFile disconfFile = cls.getAnnotation(DisconfFile.class); // // Field名 // Field field = MethodUtils.getFieldFromMethod(method, cls.getDeclaredFields(), DisConfigTypeEnum.FILE); if (field != null) { // // 请求仓库配置数据 // DisconfStoreProcessor disconfStoreProcessor = DisconfStoreProcessorFactory.getDisconfStoreFileProcessor(); Object ret = disconfStoreProcessor.getConfig(disconfFile.filename(), disconfFileItem.name()); if (ret != null) { LOGGER.debug("using disconf store value: " + disconfFile.filename() + " (" + disconfFileItem.name() + " , " + ret + ")"); return ret; } } } Object rtnOb; try { // 返回原值 rtnOb = pjp.proceed(); } catch (Throwable t) { LOGGER.info(t.getMessage()); throw t; } return rtnOb; } /** * 获取配置项数据, 只有开启disconf远程才会进行切面 * * @throws Throwable */ @Around("anyPublicMethod() && @annotation(disconfItem)") public Object decideAccess(ProceedingJoinPoint pjp, DisconfItem disconfItem) throws Throwable { if (DisClientConfig.getInstance().ENABLE_DISCONF) { // // 请求仓库配置数据 // DisconfStoreProcessor disconfStoreProcessor = DisconfStoreProcessorFactory.getDisconfStoreItemProcessor(); Object ret = disconfStoreProcessor.getConfig(null, disconfItem.key()); if (ret != null) { LOGGER.debug("using disconf store value: (" + disconfItem.key() + " , " + ret + ")"); return ret; } } Object rtnOb; try { // 返回原值 rtnOb = pjp.proceed(); } catch (Throwable t) { LOGGER.info(t.getMessage()); throw t; } return rtnOb; } }